Ansibleモジュールをplaybookで試す【初級編】
こんにちは。半瀬です。
Ansible入門の連投です。今回はモジュールの練習をいくつか晒します。
前回同様、大体コピペで確認できるように書いてみました。
練習環境
前回と同じ環境を使用します。
⭐️前回記事の手順内の1.から4.で作成可能です。
インスタンスのPrivate IPと必要なファイルは再掲します。
・管理インスタンス(ip-10-0-0-10) : 10.0.0.10 ・WEBインスタンス1(ip-10-0-1-10) : 10.0.1.10 ・WEBインスタンス2(ip-10-0-2-10) : 10.0.2.10 ・EC2キーファイル ec2-key.pem ・unusable設定ファイル ansible_hosts
※ファイル名などが間違っているとコピペでは確認できません。
実際に練習しましょう。
cronモジュール!
cronモジュールは crontab の設定追加/変更/削除が可能です。playbookで動作を確認していきます。
1. crontab追加用 playbookファイル(.yml)を準備
書き方は、「job」で実行したいコマンドを記載し、実行間隔や日時などは「*」で良いところは指定せず、必要なところのみ書いておくというかたちになります。「name」で指定した文字列は削除などにも使います。
というわけで、crontabに登録するplaybookを作成しました。
[ec2-user@ip-10-0-0-10 ~]$ cat add_cron.yml - hosts: webs sudo: yes tasks: - name: sumple cron minutely cron: name="check dirs m" job="ls -lah >> /tmp/sumple_cron_minutely.log" - name: sumple cron hourly cron: name="check dirs h" minute="55" job="ls -lah >> /tmp/sumple_cron_hourly.log" - name: sumple cron daily cron: name="check dirs d" minute="55" hour="1" job="ls -lah >> /tmp/sumple_cron_daily.log" - name: sumple cron weekly cron: name="check dirs w" minute="55" hour="1" weekday="2" job="ls -lah >> /tmp/sumple_cron_weekly.log" - name: sumple cron monthly cron: name="check dirs M" minute="55" hour="1" day="7" job="ls -lah >> /tmp/sumple_cron_monthly.log" [ec2-user@ip-10-0-0-10 ~]$
毎分/毎時/毎日/毎週/毎月 での処理実行をしたいPlaybookファイルです。
2. 実行する
[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ansible_hosts add_cron.yml
3. リモートホストのcrontabを確認
ansibleコマンドで確認してみましょう。
[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ansible_hosts webs -a "crontab -l" -s 10.0.1.10 | success | rc=0 >> #Ansible: check dirs m * * * * * ls -lah >> /tmp/sumple_cron_minutely.log #Ansible: check dirs h 55 * * * * ls -lah >> /tmp/sumple_cron_hourly.log #Ansible: check dirs d 55 1 * * * ls -lah >> /tmp/sumple_cron_daily.log #Ansible: check dirs w 55 1 * * 2 ls -lah >> /tmp/sumple_cron_weekly.log #Ansible: check dirs M 55 1 7 * * ls -lah >> /tmp/sumple_cron_monthly.log 10.0.2.10 | success | rc=0 >> #Ansible: check dirs m * * * * * ls -lah >> /tmp/sumple_cron_minutely.log #Ansible: check dirs h 55 * * * * ls -lah >> /tmp/sumple_cron_hourly.log #Ansible: check dirs d 55 1 * * * ls -lah >> /tmp/sumple_cron_daily.log #Ansible: check dirs w 55 1 * * 2 ls -lah >> /tmp/sumple_cron_weekly.log #Ansible: check dirs M 55 1 7 * * ls -lah >> /tmp/sumple_cron_monthly.log
よさそうです。ここではcronジョブ自体の実行確認は不要かと思いますので、次に進みます。次は削除をしてみます。
4. 削除用 playbookファイル(.yml)を準備
ansible内で定義した「name」に対して、「state=absent」(削除)を実行するという書き方になります。
[ec2-user@ip-10-0-0-10 ~]$ cat del_cron.yml - hosts: webs sudo: yes tasks: - name: sumple cron minutely cron: name="check dirs m" state="absent" - name: sumple cron hourly cron: name="check dirs h" state="absent" - name: sumple cron daily cron: name="check dirs d" state="absent" [ec2-user@ip-10-0-0-10 ~]$
毎分/毎時/毎日の3行を削除し、「毎週」と「毎月」を残したいPlaybookファイルです。
5. 削除実行します
[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ansible_hosts del_cron.yml
6. リモートホストの削除確認をします。
[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ansible_hosts webs -a "crontab -l" -s 10.0.1.10 | success | rc=0 >> #Ansible: check dirs w 55 1 * * 2 ls -lah >> /tmp/sumple_cron_weekly.log #Ansible: check dirs M 55 1 7 * * ls -lah >> /tmp/sumple_cron_monthly.log 10.0.2.10 | success | rc=0 >> #Ansible: check dirs w 55 1 * * 2 ls -lah >> /tmp/sumple_cron_weekly.log #Ansible: check dirs M 55 1 7 * * ls -lah >> /tmp/sumple_cron_monthly.log [ec2-user@ip-10-0-0-10 ~]$
3行は削除され、「毎週」と「毎月」が残りました。 よさそうです。
scriptモジュール!!
scriptモジュールはローカルに準備した処理ファイルをリモートホストで実行するものです。あるリモートホストの特定ファイルを基準にホストごとに処理実行する/しないを決められるパラメータが準備されています。例えば「/home/ec-user2/check」をフラグファイルとして、 ・「creates=/home/ec2-user/check」であれば、リモートホストに「check」ファイルが”ない”場合は処理実行する ・「removes=/home/ec2-user/check」であれば、リモートホストに「check」ファイルが”ある”場合は処理実行する といったようなパターン分けが可能です。 ansibleの処理対象となる2つのリモートホストの片方のみにcheckファイルを置いてパターンの確認をしてみようかと思います。
1. フラグファイルをリモートホストの片方に配置
リモートホスト「10.0.1.10」に「/home/ec2-user/check」をtouchします。
[ec2-user@ip-10-0-0-10 ~]$ ssh -i .ssh/ec2-key.pem ec2-user@10.0.1.10 "touch check"
念のため確認しておきましょう。
[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs -a "ls -l check" 10.0.1.10 | success | rc=0 >> -rw-rw-r-- 1 ec2-user ec2-user 0 Jul 7 04:20 check 10.0.2.10 | FAILED | rc=2 >> ls: cannot access check: No such file or directory
「10.0.1.10」にのみ、「check」ファイルができていますね。これで「creates/removes」のパラメータ確認ができます。
2. スクリプトを準備
スクリプトは、ansible実行元(管理インスタンスと前回は呼んでいました)に配置しておきます。
[ec2-user@ip-10-0-0-10 ~]$ cat sumple.sh #!/bin/bash log="/home/ec2-user/exec_script.txt" /bin/hostname > ${log} /bin/date >> ${log} ls -l ${0} >> ${log} exit 0
コマンドの出力結果をec2-userのホームディレクトリ内のテキストに吐き出します。
「create=/home/ec2-user/check」と指定をしておきます。
3. createsを指定したPlaybook(.yml)を用意
[ec2-user@ip-10-0-0-10 ~]$ cat exec_script.yml - hosts: webs sudo: yes tasks: - name: exec script script: /home/ec2-user/sumple.sh creates=/home/ec2-user/check [ec2-user@ip-10-0-0-10 ~]$
「check」ファイルがある10.0.1.10側には実行されず、10.0.2.10側でのみ実行されるはずです。
4. 実行します
[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ./ansible_hosts exec_script.yml
5. createsが効いているかを確認
ansibleコマンドで確認してみましょう。※ 処理結果として ec2-userのホームに 「exec_script.txt」ができているかどうかで判断ができます。
[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs -a "ls -l exec_script.txt" 10.0.1.10 | FAILED | rc=2 >> ls: cannot access exec_script.txt: No such file or directory 10.0.2.10 | success | rc=0 >> -rw-r--r-- 1 root root 170 Jul 7 04:53 exec_script.txt
「10.0.1.10」では作成されず、「10.0.2.10」には作成されています。 よさそうです。
6. 処理結果のファイルを削除
次のremovesの確認のため。 ※フラグの「check」ファイルは削除しません。
[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs -m file -a "dest=./exec_script.txt state=absent "
確認は下記の通り。
[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs -a "ls -l exec_script.txt"
7. removesを指定したPlaybook(.yml)を準備
[ec2-user@ip-10-0-0-10 ~]$ cat exec_script.yml - hosts: webs sudo: yes tasks: - name: exec script script: /home/ec2-user/sumple.sh removes=/home/ec2-user/check [ec2-user@ip-10-0-0-10 ~]$
8. 実行してみます。
[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ./ansible_hosts exec_script.yml
9. removes記述時の結果を確認してみましょう
同じようにansibleコマンドで。。
[ec2-user@ip-10-0-0-10 ~]$ ansible --private-key=.ssh/ec2-key.pem -i ./ansible_hosts webs -a "ls -l exec_script.txt" 10.0.1.10 | success | rc=0 >> -rw-r--r-- 1 root root 170 Jul 7 04:55 exec_script.txt 10.0.2.10 | FAILED | rc=2 >> ls: cannot access exec_script.txt: No such file or directory
「creates」と逆の結果になりますので、「check」ファイルを配置している「10.0.1.10」側にのみ処理が実行されていることが確認できます。 こちらもよさそうですね。
shell。
shellモジュールはリモートホストに配置しているシェルスクリプトを実行するものです。
1. playbookファイル(.yml)を準備します。
[ec2-user@ip-10-0-0-10 ~]$ cat exec_shell.yml - hosts: webs sudo: yes tasks: - name: copy file copy: src=/home/ec2-user/sumple.sh dest=/home/ec2-user/sumple.sh owner=ec2-user group=ec2-user mode=0755 - name: exec shell shell: /home/ec2-user/sumple.sh - name: delete file file: dest=/home/ec2-ser/sumple.sh state=absent [ec2-user@ip-10-0-0-10 ~]$
scriptモジュールで使用したスクリプトをリモートホストで実行したいですが、元々リモートホスト側に配置していませんでしたので、copy処理をshell実行前に入れ、実行後にfileモジュールでリモート側のスクリプトを削除しています。
2. 実行。
[ec2-user@ip-10-0-0-10 ~]$ ansible-playbook --private-key=.ssh/ec2-key.pem -i ./ansible_hosts exec_shell.yml
確認手順は省略します。scriptモジュールでの手順を要領に確認をしてみてください。
さいごに
前回の記事ではplaybookでの例をあまり書けなかったので、今回は基本操作系のモジュールを追うとともに、playbook上で動作確認をしてみました。Ansibleにはたくさんのモジュールがありますが、モジュールの操作にある程度慣れてくると、playbookでの構成管理が見えてくるのではと思います。
まだクラウドモジュールに触れられていませんので、そのあたりはまた次の機会に。。。 それでは